// 文件上传
const multer = require('multer');
const path = require('path');
const fs = require('fs'); //判断文件是否存在要用


const storage = multer.diskStorage({
  //  确定存储路径
  destination: (req, file, cb) => {
    // 指定上传文件的文件夹路径
    const uploadFolder = 'public/uploads'; //不写前缀，默认是项目根路径
    cb(null, uploadFolder);
  },
  filename: (req, file, cb) => {

    let ext = file.mimetype.split('/')[1]
    //计算出图片文件大小
    let size = (file.size / 1024 / 1024).toFixed(2)
    console.log(`1111ext是：${ext}  file.size是:${file.size}  size是:${size}`)
    console.log("req.file.fieldname----" + file.fieldname)
    console.log("req.file.mimetype----" + file.mimetype)
    console.log(req.file)

 
    // fs.access('public/uploads/logo.png', (err) => {
    //   if (err) {
    //       // 文件不存在或不可访问
    //       console.log("文件不存在")

    //   } else {
    //       // 文件存在且可访问
    //       console.log("文件已经存在！！！")
    //       res.status(200).send({ success: false, message: '文件上传失败，文件已经存在' });
    //   }
    // });

    // 这里file.size为undefined，所以不能在这里

    // *** 第一种，用时间戳作为文件名
    // 生成唯一的文件名，这里使用时间戳作为文件名
    const timestamp = Date.now();
    const extension = path.extname(file.originalname);
    const filename = `${timestamp}${extension}`;
    cb(null, filename);

    // *** 第二种，用原来文件的名字
    // ******************************
    //
    // **** fieldname：表单的name值，也就是我们设定的“logo”，（vue代码，FormData实例对象.append('logo', file)）
    // **** originalname：文件上传时的名字，可以根据它获取后缀，
    // **** encoding，mimetype 我就不详细介绍了，可以自行输出查看。
    // const { fieldname, originalname, encoding, mimetype } = file
    // const after = originalname.split('.')[1] ? '.' + originalname.split('.')[1] : '.jpg'
    // cb(null, fieldname + after);

  },
});

// 文件大小限制
const limits = {
  // 最大5MB
  fileSize:1024 * 1024 * 5
}


// 过滤一些类型
const fileFilterFun  = (req, file, cb) => {
  // file.mimetype: image/jpeg、image/png、video/quicktime等等
  console.log("req.file.mimetype----" + file.mimetype)
  // 如果希望禁止上传视频
  let index = file.mimetype.indexOf("video"); //是否包含的“video”提示
  if(index !== -1){
    req.fileValidationError = {code:'-3',msg:'上传类型不能是视频'};
    return cb(null, false, new Error('上传类型不能是视频'));
  } else {
    cb(null,true)
  }
}

 // 这里的‘logo’要跟前端代码，FormData实例对象.append('logo', file)对应起来
 // 如果你使用fetch上传的话，这里‘logo’和前端不一致好像也不报错，上传成功
 // 如果你使用axios上传文件，那么vscode控制台会报错 “MulterError: Unexpected field”，上传失败
const upload = multer({ storage: storage,limits: limits,fileFilter: fileFilterFun}).single('logo');
 
function uploadFile(req, res, next) {
  // console.log("uploadFile.js is doing111");
  // console.log("req.file.mimetype----" + req.file.mimetype)
  //  这里获取不到file的任何信息！！！

  // console.log("文件名1：" +req);
  // console.log("文件名2：" + typeof req.file);
  // console.log("文件名3：" + typeof req.file.fieldname);
  // 这里的upload表示真的开始写入
  // upload(req, res, next, async function (err) {
  //   console.log('log something');
  //   // if (err) {
  //   //   console.log(err);
  //   //   res.status(500).send({ success: false, message: '文件上传失败' });
  //   // } else {
  //   //   next(); // 调用下一个中间件或路由处理函数
  //   // }
  // });
  upload(req, res, next)
}

function limitsM() {
  return limits.fileSize / 1024 / 1024
};
 
module.exports = { 
  uploadFile, //上传文件
  limitsM, //返回上传文件的限制大小，单位（M）
};
